#include"BPNetwork.hpp"

// 使用示例：训练异或问题
int main() {
	try {
		// 创建BP网络：2输入，1个隐藏层（3神经元），1输出
		BPNetwork net({2, 3, 1}, 0.01);
		
		// 训练数据（异或问题）
		std::vector<std::pair<std::vector<double>, std::vector<double>>> trainingData = {
			{{0, 0}, {0}},
			{{0, 1}, {1}},
			{{1, 0}, {1}},
			{{1, 1}, {0}}
		};
		
		// 训练10000轮
		for (int epoch = 0; epoch < 10000; ++epoch) {
			for (const auto& data : trainingData) {
				net.train(data.first, data.second);
			}
			// 每1000轮打印一次进度
			if (epoch % 1000 == 0) {
				std::cout << "Epoch " << epoch << " 完成" << std::endl;
			}
		}
		
		// 测试网络
		std::cout << "\n测试结果：" << std::endl;
		for (const auto& data : trainingData) {
			std::vector<double> output = net.get(data.first);
			std::cout << "输入: " << data.first[0] << "," << data.first[1] 
			<< " 输出: " << output[0] 
			<< " 期望: " << data.second[0] << std::endl;
		}
		
		// 保存模型
		net.store("xor_model.bin");
		std::cout << "\n模型已保存至 xor_model.bin" << std::endl;
		
		// 加载模型并验证
		BPNetwork net2({2, 3, 1});  // 结构需与保存的模型一致
		net2.load("xor_model.bin");
		std::cout << "\n加载模型后测试：" << std::endl;
		for (const auto& data : trainingData) {
			std::vector<double> output = net2.get(data.first);
			std::cout << "输入: " << data.first[0] << "," << data.first[1] 
			<< " 输出: " << output[0] << std::endl;
		}
		
	} catch (const std::exception& e) {
		std::cerr << "错误：" << e.what() << std::endl;
		return 1;
	}
	return 0;
}